package com.xhj.mybatis.entity;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.io.Serializable;
import java.sql.PreparedStatement;

/**
 * User
 *
 * @author XJks
 * @description 用户实体类。TODO:由于新增了二级缓存装饰器类 {@link com.xhj.mybatis.cache.decorators.SerializedCache}，该类在进行序列化和反序列化时，要求实体类必须实现 Serializable 接口，否则会抛出异常。如果不使用二级缓存装饰器类，则不需要实现 Serializable 接口。
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    /**
     * 用户ID
     */
    private Long id;

    /**
     * 用户名称
     * TODO:
     *  当字段没有初始值时，在参数设置的执行链如下:
     *      1.{@link com.xhj.mybatis.scripting.defaults.DefaultParameterHandler#setParameters(PreparedStatement ps)}
     *      2.{@link com.xhj.mybatis.type.BaseTypeHandler#setParameter}
     *          (1) 在该方法中会判断参数是否为null,如果为null则调用 {@code ps.setNull(i, jdbcType.TYPE_CODE)};
     *          (2) 如果不为null则调用子类实现的 setNonNullParameter 方法
     *          (3) 如果 username 字段没有初始值则为null，因此在执行 {@code ps.setNull(i, jdbcType.TYPE_CODE)}方法，在设置时并没有问题，但在发送到数据库时会报错，所以需要给字段一个初始值，避免为null。
     *          (4) 注意，报错的时机是向数据库发送SQL语句时，而不是在设置参数时，这可能与数据库对不同类型的 null 值处理有关。
     */
    private String username = "";

    /**
     * 用户状态
     */
    private Integer status = User.ACTIVE;

    /**
     * Boolean类型字段
     */
    private Boolean booleanColumn = false;

    /**
     * Byte类型字段
     */
    private Byte byteColumn = 0;

    /**
     * Short类型字段
     */
    private Short shortColumn = 0;

    /**
     * Integer类型字段
     */
    private Integer integerColumn = 0;

    /**
     * Long类型字段
     */
    private Long longColumn = 0L;

    /**
     * Float类型字段
     */
    private Float floatColumn = 0.0f;

    /**
     * Double类型字段
     */
    private Double doubleColumn = 0.0;

    /**
     * String类型字段
     */
    private String stringColumn = "";

    /**
     * 用户状态常量
     */
    public static Integer ACTIVE = 0;
    public static Integer INACTIVE = 1;
    public static Integer SUSPENDED = 2;

    /**
     * 空用户实例
     */
    public static User EMPTY_USER;

    static {
        EMPTY_USER = new User(null, null, null, null, null, null, null, null, null, null, null);
    }
}
